home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / MYUTIL / TABLEHAN.I < prev    next >
Encoding:
Modula Implementation  |  1990-05-04  |  5.1 KB  |  206 lines

  1. (*---------------------------------------------------------------------*)
  2. (*---                     Modul TableHandler                        ---*)
  3. (*---                    --------------------                       ---*)
  4. (*---                                                               ---*)
  5. (*---  Basismodul fuer XREF, aus 4th Edition WIRTH Seite 91         ---*)
  6. (*---                                                               ---*)
  7. (*--- Programmiersprache :  Megamax-Modula-2 für Atari ST           ---*)
  8. (*--- Implementation     :  Uwe A. Ruttkamp, 30.1.89                ---*)
  9. (*--- Portierung         :  Thomas Tempelmann, 4.5.90               ---*)
  10. (*---                                                               ---*)
  11. (*---------------------------------------------------------------------*)
  12.  
  13. IMPLEMENTATION MODULE TableHandler;
  14.  
  15. FROM InOut   IMPORT Write, WriteInt, WriteLn;
  16. FROM Storage IMPORT ALLOCATE, DEALLOCATE;
  17.  
  18. CONST
  19.   TableLength = 3000;
  20.  
  21. TYPE
  22.   TreePtr = POINTER TO Word;
  23.   ListPtr = POINTER TO Item;
  24.  
  25.   Item = RECORD
  26.            num  : INTEGER;
  27.            next : ListPtr;
  28.          END;
  29.  
  30.   Word = RECORD
  31.            key        : INTEGER;   (* table index *)
  32.            first      : ListPtr;   (* list head   *)
  33.            left, right: TreePtr;
  34.          END;
  35.  
  36.   Table = TreePtr;
  37.  
  38. VAR
  39.   id    : ARRAY [0..WordLength] OF CHAR;
  40.   ascinx: INTEGER;
  41.   asc   : ARRAY [0..TableLength-1] OF CHAR;
  42.  
  43. PROCEDURE InitTable (VAR t: Table );
  44.   BEGIN
  45.     ALLOCATE (t, SIZE (Word)); t^.right:= NIL;
  46.   END InitTable;
  47.  
  48. PROCEDURE Search (p: TreePtr): TreePtr;
  49.    (* search node with name equal to id *)
  50.   TYPE
  51.     Relation = (less, equal, greater);
  52.   VAR
  53.     q: TreePtr;
  54.     r: Relation;
  55.     i: INTEGER;
  56.   
  57.   PROCEDURE rel (k: INTEGER ): Relation;
  58.       (* compare id with asc[k] *)
  59.     VAR
  60.       i  : INTEGER;
  61.       R  : Relation;
  62.       x,y: CHAR;
  63.     BEGIN
  64.       i:= 0; R:= equal;
  65.       LOOP
  66.         x:= id[i]; y:= asc[k];
  67.         IF CAP (x) # CAP (y) THEN EXIT END;
  68.         IF x <= " " THEN RETURN R END;
  69.         IF x < y THEN R:= less ELSIF x > y THEN R:= greater END;
  70.         INC (i); INC (k)
  71.       END;
  72.       IF CAP (x) > CAP (y) THEN RETURN greater ELSE RETURN less END
  73.     END rel;
  74.     
  75.   BEGIN
  76.     q:= p^.right;
  77.     r:= greater;
  78.     WHILE q # NIL DO
  79.       p:= q; r:= rel (p^.key);
  80.       IF r = equal THEN RETURN p
  81.       ELSIF r = less THEN q:= p^.left
  82.       ELSE q:= p^.right
  83.       END
  84.     END;
  85.     ALLOCATE (q, SIZE (Word));   (* not found, hence insert *)
  86.     IF q # NIL THEN
  87.       WITH q^ DO
  88.         key:= ascinx; first:= NIL; left:= NIL; right:= NIL
  89.       END;
  90.       IF r = less THEN p^.left:= q ELSE p^.right:= q END;
  91.       i:= 0;   (* copy identifier into asc table *)
  92.       WHILE id[i] > " " DO
  93.         IF ascinx = TableLength THEN
  94.           asc[ascinx]:= " "; id[i]:= " "; overflow:= 1
  95.         ELSE
  96.           asc[ascinx]:= id[i]; INC (ascinx); INC (i)
  97.         END
  98.       END;
  99.       asc[ascinx]:= " "; INC (ascinx)
  100.     END;
  101.     RETURN q
  102.   END Search;
  103.   
  104. PROCEDURE Record (t: Table; VAR x: ARRAY OF CHAR; n: INTEGER);
  105.   VAR
  106.     p: TreePtr;
  107.     q: ListPtr;
  108.     i: INTEGER;
  109.   BEGIN
  110.     i:= 0;
  111.     REPEAT
  112.       id[i]:= x[i]; INC (i)
  113.     UNTIL (id[i-1] = " ") OR (i = WordLength);
  114.     p:= Search (VAL (TreePtr, t) );
  115.     IF p = NIL THEN
  116.       overflow:= 2
  117.     ELSE
  118.       ALLOCATE (q, SIZE (Item));
  119.       IF q = NIL THEN
  120.         overflow:= 3
  121.       ELSE
  122.         q^.num:= n; q^.next:= p^.first; p^.first:= q
  123.       END
  124.     END
  125.   END Record;
  126.  
  127. PROCEDURE Tabulate (t: Table);
  128.  
  129.   PROCEDURE PrintItem (p: TreePtr);
  130.     CONST
  131.       L = 6;
  132.       N = (LineWidth-WordLength) DIV L;
  133.     VAR
  134.       ch : CHAR;
  135.       i,k: INTEGER;
  136.       q  : ListPtr;
  137.     BEGIN
  138.       i:= WordLength + 1;
  139.       k:= p^.key;
  140.       REPEAT
  141.         ch:= asc[k];
  142.         DEC (i); INC (k); Write (ch)
  143.       UNTIL ch <= " ";
  144.       WHILE i > 0 DO
  145.         Write (" "); DEC (i)
  146.       END;
  147.       q:= p^.first; i:= N;
  148.       WHILE q # NIL DO
  149.         IF i = 0 THEN
  150.           WriteLn; i:= WordLength + 1;
  151.           REPEAT
  152.             Write (" "); DEC (i);
  153.           UNTIL i = 0;
  154.           i:= N;
  155.         END;
  156.         WriteInt (q^.num, L); q:= q^.next; DEC (i)
  157.       END;
  158.       WriteLn;
  159.     END PrintItem;
  160.    
  161.   PROCEDURE TraverseTree (p: TreePtr);
  162.     BEGIN
  163.       IF p # NIL THEN
  164.         TraverseTree (p^.left);
  165.         PrintItem (p);
  166.         TraverseTree (p^.right);
  167.       END;
  168.     END TraverseTree;
  169.    
  170.   BEGIN
  171.     WriteLn;
  172.     TraverseTree (t^.right)
  173.   END Tabulate;
  174.  
  175. PROCEDURE FinishTable (VAR t: Table);
  176.  
  177.   PROCEDURE DeleteList (l: ListPtr);
  178.     BEGIN
  179.       IF l # NIL THEN
  180.         DeleteList (l^.next);
  181.         DEALLOCATE (l, 0);
  182.       END;
  183.     END DeleteList;
  184.  
  185.   PROCEDURE DeleteTree (p: TreePtr);
  186.     BEGIN
  187.       IF p # NIL THEN
  188.         DeleteTree (p^.left);
  189.         DeleteTree (p^.right);
  190.         DeleteList (p^.first);
  191.         DEALLOCATE (p, 0);
  192.       END;
  193.     END DeleteTree;
  194.  
  195.   BEGIN
  196.     DeleteTree (t^.right);
  197.     DEALLOCATE (t, 0);
  198.     t:= NIL;
  199.   END FinishTable;
  200.  
  201. BEGIN
  202.   ascinx:= 0;
  203.   id [WordLength]:= " ";
  204.   overflow:= 0;
  205. END TableHandler.
  206.